package com.dongzili.easyes.common.es;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dongzili.easyes.custom.entity.SRelationModel;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericTypeUtils {

    /**
     * 获取QueryWrapper的具体泛型类型
     * 注意：要求QueryWrapper必须是匿名子类或明确指定泛型的子类实例
     */
    @SuppressWarnings("unchecked")
    public static <T> Class<T> getGenericType(QueryWrapper<T> wrapper) {
        // 获取当前对象的类型（如果是匿名子类，这里会包含泛型信息）
        Type type = wrapper.getClass().getGenericSuperclass();

        // 如果是参数化类型（即包含泛型参数）
        if (type instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) type;
            // 获取泛型参数数组（QueryWrapper只有一个泛型参数T）
            Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
            if (actualTypeArguments.length > 0) {
                Type actualType = actualTypeArguments[0];
                // 如果是具体的类类型，直接返回
                if (actualType instanceof Class<?>) {
                    return (Class<T>) actualType;
                }
            }
        }

        // 如果直接实例化QueryWrapper<T>，会走到这里（因为泛型被擦除为T）
        throw new IllegalArgumentException("无法获取泛型类型，请使用匿名子类创建QueryWrapper（如new QueryWrapper<EsRelationModel>(){}）");
    }

    public static void main(String[] args) {
        // 错误示例：直接实例化QueryWrapper，无法获取泛型类型
        QueryWrapper<SRelationModel> wrongWrapper = new QueryWrapper<SRelationModel>();
        try {
            System.out.println(getGenericType(wrongWrapper)); // 会抛出异常
        } catch (Exception e) {
            System.out.println("错误示例：" + e.getMessage());
        }

        // 正确示例：使用匿名子类创建QueryWrapper（关键！）
        QueryWrapper<SRelationModel> correctWrapper = new QueryWrapper<SRelationModel>() {};
        try {
            Class<SRelationModel> type = getGenericType(correctWrapper);
            System.out.println("正确示例：泛型类型为 " + type.getName()); // 输出EsRelationModel
        } catch (Exception e) {
            System.out.println("正确示例：" + e.getMessage());
        }
    }
}